還有兩種 data binding 的方式,前面講的兩種都是將資料從 ts
送到 html
,今天來看看 Event binding 和 Two-way binding。
當我們想在頁面上做一些互動、觸發事件時,就可以使用 Event binding 。比方說我們設計一個 button
,會將想要做的事情寫成 function 放在 ts
中,透過 Event binding ,在按下按鈕時執行這個 function,以下是一個簡單的例子:
語法跟前面的 property binding 很像,只是將中括號換成小括號:
()=""
// app.component.html
<p>{{context}}</p>
<button (click)="onClick()" >magic</button>
// app.component.ts
export class AppComponent {
context = 'context';
onClick() {
this.context = 'context changed!';
}
}
這邊將 button
的 click
屬性,綁定到 onClick()
這個 function。
當我按下 magic
後,觸發了 ts
中的 onClick()
function ,更改了 context 的內容:
Event binding 像前面的 Property binding 類似,可以有別種寫法:
// app.component.html
<button on-click="onClick()" >magic</button>
使用 Two-way binding 表示資料流是雙向的,即是說,在 html
更改了屬性的值,對應到在 ts
中的變數,也會跟著改變其值,反之亦然。其實可以把它看作是 Property binding 和 Event binding 的結合,語法如下:
[()] = ""
我們試試看對表單元素做 Two-way binding,由於原生的html沒有屬性是同時具有 value 跟 event 的特性,這個時候我們需要使用到 ngModel
來擔任這個角色:
// app.component.html
<input type="text" [(ngModel)]='number1'>
<input type="text" [ngModel]='number2'>
<button (click)="display()" >display</button>
// app.component.ts
export class AppComponent {
number1 = 1;
number2 = 2;
display() {
alert('number1 is ' + this.number1 +
', number2 is ' + this.number2);
}
這邊主要功能是:
設定兩個 text
欄位和一個 button
,兩個 text
分別綁定 number1
和 number2
,點擊 button
時會跳出提示框顯示 number1
和 number2
的值。
但這樣還不能執行,使用 ngModel
必須先在 app.module.ts
中 import FormsModule
。
切換到 app.module.ts
,我們輸入 FormsModule
的前幾個字,如果有安裝 VSCODE 的 extention 的話, VSCODE 就會產生提示字,選 ng-import-FormsModule
,就會幫我們產生完整的 import 程式碼:
接著在 @NgModule
的 imports
中加入 FormsModule:
如此就可以使用 ngModel
了。
左邊是使用 Two-way binding 的 text
, 右邊則是使用 Property binding。
按下 display :
那我們手動改變 text
中的值:
發現左邊的 text
因為使用Two-way binding,所以 number1
跟著改變其值,但是 number2 則沒有: